#include <iostream>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#include <errno.h>
#include <vector>
#include <unistd.h>
#include <math.h>

#include "packet.h"
#include "samolot.h"
//#include "punkt.h"

#define ATTACH_POINT "database"

using namespace std;

Samolot::Samolot()
{
	Pozycja = LosujPktStartu();   //prawidlowo;

//dla testow	
//   Pozycja.x = 50; //losuj
  // Pozycja.y = 350; /* */
}

Samolot::Samolot(int a, int b){
	Samolot();
    Pozycja.x = a;
    Pozycja.y = b;
}


Samolot::~Samolot(){
}

punkt Samolot::LecDo(float pozx, float pozy, float poz_lotx, float poz_loty, float pred)
{
      punkt A;

      float wspx = poz_lotx - pozx;
      float wspy = poz_loty - pozy;
    //  cout << "wspx = " <<  wspx << " ;wspy = " << wspy << endl;
      float predkosc ;
            
      if (wspx == 0 && wspy == 0) {cout <<"na miejscu"<<endl;}
      
        else predkosc = pred/OdlegloscOd(poz_lotx, poz_loty);
      
//      cout << predkosc << endl;
	     A.x = pozx + predkosc * wspx;
    	 A.y = pozy + predkosc * wspy;
  //    cout << "wspx = " <<  A.x << " ;wspy = " << A.y << endl <<endl;

  		Zasieg(pred);

      return A;
}

punkt Samolot::LecDo(punkt A, punkt B, float pred)
{
      punkt C = LecDo(A.x, A.y, B.x, B.y, pred);
      return C;
}


lotnisko_t Samolot::LosujLotnisko(vector<lotnisko_t> listalotnisk)
{
    int index = (int)(rand()) % listalotnisk.size();
	if(index >= 0 && index < listalotnisk.size())
		return listalotnisk[index];
	return listalotnisk[0];
}

int Samolot::getX()
{
	return (int)round(Pozycja.x);
}

int Samolot::getY()
{
	return (int)round(Pozycja.y);
}

punkt Samolot::LosujPktStartu()
{
	punkt PktStartu;

	int i = (int)(rand()) % (2*MAX_X+2*MAX_Y);
	
	if ( i  > MAX_X+MAX_Y )
		{
		i = i - MAX_X - MAX_Y;
		if ( i > MAX_X )
			{
			PktStartu.x = MAX_X;
			PktStartu.y = i - MAX_X;
			}
		else
			{
			PktStartu.x = i;
			PktStartu.y = MAX_Y;			
			}
		}
	else
		if ( i > MAX_X )
		{
			PktStartu.x = 0;
			PktStartu.y = i -MAX_X;
		}
		else 
		{
			PktStartu.x = i;
			PktStartu.y = 0;
		}
	return PktStartu;
}



float Samolot::OdlegloscOd(float wspx, float wspy)
{
	return sqrt( (wspx-Pozycja.x)*(wspx-Pozycja.x) + (wspy-Pozycja.y)*(wspy-Pozycja.y));
}

float Samolot::OdlegloscOd(punkt A)
{
	return OdlegloscOd(A.x, A.y);
}


void Samolot::PobierzListeLotnisk()
{
///////////////////////////////////
// Pobierz liste lotnisk
/* ================================================
	lotnisko_t lotnisko;
    lotnisko.lotnisko_id = 1;     lotnisko.stan = 1;    strncpy(lotnisko.nazwa,"lotnisko1",50);    lotnisko.x_o = 50;
    lotnisko.x_k = 50;    lotnisko.y_o = 50;    lotnisko.y_k = 50;    lotnisko.pojemnosc =2;
    lista_lotnisk.push_back(lotnisko);
    lotnisko.lotnisko_id = 2;    lotnisko.stan = 1;    strncpy(lotnisko.nazwa,"lotnisko 2",50);    lotnisko.x_o = 150;
    lotnisko.x_k = 150;    lotnisko.y_o = 150;    lotnisko.y_k = 150;    lotnisko.pojemnosc = 22;
    lista_lotnisk.push_back(lotnisko);
    lotnisko.lotnisko_id = 3;    lotnisko.stan = 1;    strncpy(lotnisko.nazwa,"lotnisko 3",50);    lotnisko.x_o = 250;
    lotnisko.x_k = 250;    lotnisko.y_o = 250;    lotnisko.y_k = 250;    lotnisko.pojemnosc = 22;
    lista_lotnisk.push_back(lotnisko); 
    ==============================================*/


	// Start connection with databse
	 int fd, rcvid, chid;
	 packet_t msg, reply;    
    
   	if ((fd = name_open("database", NAME_FLAG_ATTACH_GLOBAL)) == -1) {
		cerr << "Nie mozna poalczyc sie z baza danych.";
    }

    msg.hdr.type = 0x00;

    // Do whatever work you wanted with server connection 
	
	msg.type = PACKET_AIRPORTS_COUNT;
	MsgSend(fd, &msg, sizeof(msg), &reply, sizeof(reply));
	int ilosc_lotnisk = reply.samolot.stan -1;		// ilosc lotnik w  bd
	
	msg.type = PACKET_AIRPORTS_GET;
	for (int i=0; i < ilosc_lotnisk; i++)
	{
		msg.samolot.stan = i;
		MsgSend(fd, &msg, sizeof(msg), &reply, sizeof(reply));
		lista_lotnisk.push_back(reply.lotnisko);
		cout<<"Otrzymalem lotnisko o nazwie: !!"<< reply.lotnisko.nazwa<<"!! "<< reply.samolot_typ.pasazerowie_max<<" " << endl;		
	}
		

    // Close the connection with database
    name_close(fd);

}

lotnisko_t Samolot::KtoreLotniskoObsluguje(float odleglosc)
{
	vector<lotnisko_t>::iterator it  = lista_lotnisk.begin();
	for( ; it != lista_lotnisk.end() ;  it++){
		if (OdlegloscOd( (it->x_o + it -> x_k)/2 , ( it->y_o + it-> y_k )/2 ) < odleglosc) 
			{
//			cout << "obsluguje lotnisko :" << it->nazwa <<endl;
			return *it;
			}
	}
	return *it;
}


int Samolot::getZasieg()
{
	return zasieg_max;
}

void Samolot::setZasieg(int zasieg)
{
	 zasieg_max = zasieg;
	return;
}


int Samolot::Zasieg(float predkosc)
{
	setZasieg(getZasieg() - - ceil(predkosc));
	return 0;
}